package leetcode.code0014;

import leetcode.IDebug;
import leetcode.helper.HelpDebug;

public class Solution476_1 implements IDebug {
	public int findComplement(int num) {
		int pos = 0;// 处理pos+1位
		int ans = 0;// 答案
		System.out.println("待处理数字 `num = " + num + "`");
		System.out.println("待处理数字 `num` 的二进制是`" + Integer.toBinaryString(num) + "`");
		System.out.println("当`num>0` 说明原数有1没处理完");
		while (num > 0) {// 还有数就做
			System.out.println("=== while 开始===");
			System.out.println("1 . 新一轮开始, 此时的`num`是`" + num + "`");
			System.out.println("2 . `pos = " + pos + "` 当前是`ans`的第`" + (pos + 1) + "`位");
			int last = num & 1;// 最后一位
			System.out.println("3 . 用`num & 1` 取出最后一位, 就是对应答案中`pos+1=` `" + (pos + 1) + "`的位置");
			System.out.println("4 . `" + Integer.toBinaryString(num) + "` 最后一个数是 `" + last + "`");
			if (last == 0) {
				System.out.println("5 . 满足`if (last == 0)`, 当前位原数是`0`, 需要处理");
				System.out.println("6 . 当前答案 ans 的二进制是 `" + Integer.toBinaryString(ans) + "`");
				System.out.println("7 . 当前是`ans`的第`" + (pos + 1) + "`位, 原数是`0`, ans这一位要变成`1`");
				System.out.println("8 . 所以将二进制`" + Integer.toBinaryString(1 << pos) + "` 记录到答案上, 用 `|` 运算");
				ans |= (1 << pos);// 添加到当前攒的数中
				System.out.println("9 . 经过`ans |= (1 << pos)` 后");
				System.out.println("10. ans变成 `" + Integer.toBinaryString(ans) + "`");
			} else {
				System.out.println("11. 当前位是`1`, 不管了");
			}
			pos++;
			System.out.println("12. 执行`pos++;` , 这一位处理完了, 下一位是 pos = " + pos);
			num >>>= 1;
			System.out.println("13. 执行`num >>>= 1;` , 将原数待处理的下一位`移动到最后一位` num变成`" + Integer.toBinaryString(num) + "`");
		}
		System.out.println("最终 `ans` 变成 `" + Integer.toBinaryString(ans) + "`");
		return ans;
	}

	@Override
	public void debug1() {
		int num = 5;
		int e = 2;
		int r = this.findComplement(num);
		HelpDebug.compare(e, r);
	}

	@Override
	public void debug2() {
		int num = 1;
		int e = 0;
		int r = this.findComplement(num);
		HelpDebug.compare(e, r);
	}

	@Override
	public void debug3() {

	}

	@Override
	public void debug4() {
		// TODO Auto-generated method stub

	}

	public static void main(String[] args) {
		Solution476_1 so = new Solution476_1();
//		so.debug1();
//		so.debug2();
		int num = 19;
//		System.out.println(Integer.toBinaryString(num));
		so.findComplement(num);
	}

}
